package com.kamistoat.ruoyi.ruoyicommonredis.configure;

import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 全局redis配置
 */
@Configuration
@AutoConfigureBefore(RedisAutoConfiguration.class)
public class RedisConfig extends CachingConfigurerSupport {
// public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 想要自定义序列化机制，同样需要自定义Bean
     * 只要自定义一个 RedisSerializer<> 就可以覆盖掉 RedisTemplate中k-v的所有序列化机制
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new FastJson2JsonRedisSerializer(Object.class);
    }


//    /**
//     * 自定义的RedisTemplate，其实和上面的Bean的功能相同，也是在配置序列化机制。所以两个Bean写一个就可以，除非想对RedisTemplate做进一步配置，否则一般写第一个Bean
//     * @return 注意，名字不能写 redisTemplate，因为SpringBoot自身会管理一个原生的RedisTemplate，同名Bean会报错
//     */
//    @Bean
//    @SuppressWarnings(value = {"unchecked", "rawtypes"})
//    public RedisTemplate<Object, Object> myRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
//        RedisTemplate<Object, Object> template = new RedisTemplate<>();
//        template.setConnectionFactory(redisConnectionFactory);
//
//        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
//
//        // 使用StringRedisSerializer来序列化和反序列化redis的key值
//        template.setKeySerializer(new StringRedisSerializer());
//        template.setValueSerializer(serializer);
//
//        // Hash的key也采用StringRedisSerializer的序列化方式
//        template.setHashKeySerializer(new StringRedisSerializer());
//        template.setHashValueSerializer(serializer);
//
//        template.afterPropertiesSet();
//        return template;
//    }
}
